package rwlock

import (
	"fmt"
	"sync"
	"time"
)

//读写锁
//绝大多数的web系统来书，都是读多写少
//有1w个人同时读数据库，A读的时候，B能写吗？为什么要加锁呢？  -> 脏读（比如，下单的时候100元，结算的时候变1w了，怎么办？）
//一定要加锁。读写上同一把锁。并发严重下降。
//需要一把锁，读之间不会产生影响，写和读之间才会产生影响
var rwl sync.RWMutex

var wg sync.WaitGroup
var total int

func read() {
	defer wg.Done()

	//读锁
	rwl.RLock()
	fmt.Println("开始读取数据")
	time.Sleep(time.Second)
	fmt.Println("读取成功")
	rwl.RUnlock()
}

func write() {
	defer wg.Done()

	//写锁
	rwl.Lock()
	fmt.Println("开始修改数据")
	time.Sleep(time.Second * 20)
	fmt.Println("修改成功")
	rwl.Unlock()
}

func LockLearnWithRWMutex() {
	//按理说，值应该是0
	//如果不加锁，结果不是0的

	for i := 0; i < 5; i++ {
		wg.Add(1)
		go read()
	}
	for i := 0; i < 1; i++ {
		wg.Add(1)
		go write()
	}
	wg.Wait()

	fmt.Println("total: ", total)
}
